gtkscrolledwindow: Refactor kinetic scroll animation
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 15 Mar 2022 20:59:12 +0000 (21:59 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 19 Mar 2022 11:35:11 +0000 (12:35 +0100)
Do not depend on the kinetic scroll helpers existing or not before
exiting the animation, as we may want to keep those a little bit
longer after stopped.

gtk/gtkscrolledwindow.c

index 416c8288eb66ff9dcaadc4c9e8bc19585aa10316..a5294d8003fe4902b53edb117a3a029a5e1899cd 100644 (file)
@@ -3268,6 +3268,7 @@ scrolled_window_deceleration_cb (GtkWidget         *widget,
   GtkAdjustment *hadjustment, *vadjustment;
   gint64 current_time;
   double position, elapsed;
+  gboolean retval = G_SOURCE_REMOVE;
 
   current_time = gdk_frame_clock_get_frame_time (frame_clock);
   elapsed = (current_time - priv->last_deceleration_time) / (double)G_TIME_SPAN_SECOND;
@@ -3283,6 +3284,7 @@ scrolled_window_deceleration_cb (GtkWidget         *widget,
     {
       priv->unclamped_hadj_value = position;
       gtk_adjustment_set_value (hadjustment, position);
+      retval = G_SOURCE_CONTINUE;
     }
   else if (priv->hscrolling)
     g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free);
@@ -3292,19 +3294,17 @@ scrolled_window_deceleration_cb (GtkWidget         *widget,
     {
       priv->unclamped_vadj_value = position;
       gtk_adjustment_set_value (vadjustment, position);
+      retval = G_SOURCE_CONTINUE;
     }
   else if (priv->vscrolling)
     g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free);
 
-  if (!priv->hscrolling && !priv->vscrolling)
-    {
-      gtk_scrolled_window_cancel_deceleration (scrolled_window);
-      return G_SOURCE_REMOVE;
-    }
-
-  gtk_scrolled_window_invalidate_overshoot (scrolled_window);
+  if (retval == G_SOURCE_REMOVE)
+    gtk_scrolled_window_cancel_deceleration (scrolled_window);
+  else
+    gtk_scrolled_window_invalidate_overshoot (scrolled_window);
 
-  return G_SOURCE_CONTINUE;
+  return retval;
 }
 
 static void